home *** CD-ROM | disk | FTP | other *** search
/ Over 1,000 Windows 95 Programs / Over 1000 Windows 95 Programs (Microforum) (Disc 1).iso / 1138 / source.zip / UNIXMAIL.C < prev    next >
C/C++ Source or Header  |  1995-02-05  |  4KB  |  174 lines

  1. /*     unixmail.c -- Handle unix mail
  2.     This file is part of Paperboy, an offline mail/newsreader for Windows
  3.     Copyright (C) 1995  Michael H. Vartanian
  4.         vart@clark.net
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. */
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <time.h>
  23. #include <stdlib.h>
  24. #include <ctype.h>
  25. #include "unixmail.h"
  26. #include "soup.h"
  27. #include "error.h"
  28. #include "areas.h"
  29. #include "structs.h"
  30. #include "msgs.h"
  31.  
  32. int getbinmailstarts (FILE * fin, struct llareas * area)
  33. {
  34.     unsigned long length, pos;
  35.     struct llmsg * cur;
  36.  
  37.     
  38.     assert(fin!=NULL);
  39.     assert(area!=NULL);
  40.     assert(area->head==NULL);
  41.  
  42.     rewind(fin);
  43.     cur=NULL;
  44.  
  45.     while (!feof(fin))
  46.     {
  47.         length=0;
  48.         length+= (fgetc(fin) * 256L *256L * 256L);
  49.         if feof(fin) break;
  50.         length+= (fgetc(fin) * 256L *256L);
  51.         length+= (fgetc(fin) * 256L);
  52.         length+= (fgetc(fin));
  53.         pos=ftell(fin);
  54.         fseek(fin,length,SEEK_CUR);     /* Goto next message, clears feof*/
  55.  
  56.         if (length>0)
  57.         {               
  58.             /* Add to head of linked list */
  59.             cur=(struct llmsg *)malloc(sizeof(struct llmsg));
  60.             if (cur==NULL) { errortext="getbinmailstarts: struct llmsg"; return ERRMEM; }
  61.             memset(cur,0,sizeof(struct llmsg));     /* zero it out */
  62.             cur->magic=MSGMAGIC;
  63.             cur->next=area->head;
  64.             area->head=cur;
  65.             cur->start=pos;
  66.             cur->length=length;
  67.         }
  68.     }
  69.     
  70.     return 0;
  71. }
  72.     
  73.  
  74. int getunixmailstarts (FILE * fin, struct llareas * area)
  75. {
  76.     char line[MAXLINE];
  77.     long pos;
  78.     struct llmsg * cur;
  79.  
  80.     assert(fin!=NULL);
  81.     assert(area!=NULL);
  82.     assert(area->head==NULL);
  83.  
  84.     rewind(fin);
  85.     cur=NULL;
  86.  
  87.     while (!feof(fin))
  88.     {
  89.         /* Get start and end of message */
  90.         pos=ftell(fin);
  91.         fgetlf(sizeof(line)-1,fin,line);
  92.         if (feof(fin)) break;
  93.  
  94.         if (strncmp(line,MAILHEAD,strlen(MAILHEAD))==0)
  95.         {
  96.             if (cur!=NULL)
  97.             {
  98.             /* Figure out length of previous one */
  99.                 cur->length=pos - cur->start;
  100.             }
  101.  
  102.             /* Add to head of linked list */
  103.             cur=(struct llmsg *)malloc(sizeof(struct llmsg));
  104.             if (cur==NULL) { errortext="getunixmailstarts: struct llmsg"; return ERRMEM; }
  105.             memset(cur,0,sizeof(struct llmsg));     /* zero it out */
  106.             cur->magic=MSGMAGIC;
  107.             cur->next=area->head;
  108.             area->head=cur;
  109.  
  110.             cur->start=pos;
  111.             cur->length=0;          /* To be calculated at next message */
  112.         }
  113.     }
  114.  
  115.     if (cur!=NULL)
  116.     {
  117.     /* Figure out length of previous one */
  118.         cur->length=ftell(fin) - cur->start;
  119.     }
  120.  
  121.     return 0;
  122. }
  123.  
  124. int parseunixmail (struct llareas * area)
  125. {
  126. /* Unixmail begins each message with a "From " */
  127.     FILE * fin;
  128.     int     result;
  129.  
  130.     area->head=NULL;        /* No message yet */
  131.  
  132.     /*      Open the file */
  133.     assert(area->prefix!=NULL);
  134.     fin=fopen(area->prefix,"rb");  /* MS-DOS likes it binary */
  135.     if (fin==NULL) { errortext="parseunixmail: .MSG file not found"; return ERRIO; }
  136.  
  137.     result=getunixmailstarts(fin,area);     /* An index file would definetly have this */
  138.     if (result) return result;
  139.  
  140.     result=getheaders(fin,area);    /* An index file might have this */
  141.     if (result) return result;
  142.  
  143.     fclose(fin);
  144.     return 0;
  145. }
  146.  
  147.     
  148. int parsebinmail (struct llareas * area)
  149. {
  150. /* binary mail begins with length in big-endian format */
  151.     FILE * fin;
  152.     int     result;
  153.  
  154.     area->head=NULL;        /* No message yet */
  155.  
  156.     /*      Open the file */
  157.     assert(area->prefix!=NULL);
  158.     fin=fopen(area->prefix,"rb");  /* MS-DOS likes it binary */
  159.     if (fin==NULL) 
  160.         /* return ERRIO; */
  161.         return 0;
  162.  
  163.     result=getbinmailstarts(fin,area);      /* An index file would definetly have this */
  164.     if (result) return result;
  165.  
  166.     result=getheaders(fin,area);    /* An index file might have this */
  167.     if (result) return result;
  168.  
  169.     fclose(fin);
  170.     return 0;
  171. }
  172.  
  173.     
  174.